import {reactive, ref} from "vue";
function tableStep (config, proxy) {
    let formRules = reactive({})
    let tableForm = reactive({})
    let searchForm = reactive({})
    let dictionaryData = ref({})

    let dicKeys = [], baseKeys = []
    if (config.column && config.column.length) {
        for (let i = 0; i < config.column.length; i++) {
            config.column[i] = Object.assign({
                label: null,                  // 显示的标题
                type: null,
                inputType: "input",
                defaultSearch: false,         // 默认作为检索添加
                defaultForm: false,           // 默认作为编辑添加
                index: null,                  // 如果设置了 type=index，可以通过传递 index 属性来自定义索引
                prop: "searchKey",            // 对应列内容的字段名，也可以使用 property 属性
                showProp: null,               // 当前值存在时，table列显示当前字段值
                width: null,                  // 对应列的宽度
                minWidth: null,            // 对应列的最小宽度，与 width 的区别是 width 是固定的，min-width 会把剩余宽度按比例分配给设置了 min-width 的列
                fixed: null,                  // 列是否固定在左侧或者右侧，true 表示固定在左侧 	true, left, right
                align: "left",                // 对齐方式
                dicId: "id",
                dicLabel: "label",
                showOverflowTooltip: false,   // 当内容过长被隐藏时显示 tooltip
                formShow: true,            // 是否在form中显示
                tableShow: config.column[i].type !== 'split',                // 是否在table中显示
                sortable: false,                  // 对应列是否可以排序，如果设置为 'custom'，则代表用户希望远程排序，需要监听 Table 的 sort-change 事件
                sort: 0,                        // 表格显示顺序，降序
                effectFalseLabel: null,
                effectTrueLabel: null,
                emptyText: null,
                href: false,                    // 当前列是否有点击事件
                callBack: null,                 // 点击返回事件
            }, config.column[i])

            if (!config.column[i].form) config.column[i].form = {}
            if (typeof config.column[i].form.disabled !== 'function') {
                let disabled = !!config.column[i].form.disabled
                config.column[i].form.disabled = function () {
                    return disabled
                }
            }
            if (typeof config.column[i].form.vIf !== 'function') {
                // eslint-disable-next-line no-prototype-builtins
                let vIf = config.column[i].form.hasOwnProperty("vIf") ? !!config.column[i].form.vIf : true
                config.column[i].form.vIf = function () {
                    return vIf
                }
            }
            config.column[i].form = Object.assign({
                type: "text",
                default: null,
                span: 12,
                labelColor: false,                                            // 标签设置颜色
                defaultIndex: config.column[i].type === 'radio' ? 0 : null,
                filterable: false,                                            // 是否可搜索, 仅对type=select时适用
                remote: false,                                                // 是否为远程搜索, 仅对type=select时适用
                remoteMethod: null,                                           // 远程搜索方法, 仅对type=select时适用
                remoteMethodKey: null,
                remoteMethodDataKey: null,
                dateType: 'date',                                             // 日期类型, 仅对type=date时适用
                valueFormat: null,                                            // 可选，绑定值的格式。不指定则绑定值为 Date 对象
                disabled: function () {
                    return false
                },
                vIf: function () {
                    return true
                },
            }, config.column[i].form)
            if (config.column[i].formShow || config.column[i].defaultForm) {
                tableForm[config.column[i].prop] = config.column[i].form.default || (config.column[i].form.multiple ? [] : null)
                if (config.column[i].form.rules) {
                    for (let j = 0; j < config.column[i].form.rules.length; j++) {
                        let label = "";
                        if (!config.column[i].form.rules[j].message) {
                            switch (config.column[i].type) {
                                case "radio":
                                case "select":
                                case "tree":
                                case "date":
                                    label = "请选择"
                                    break
                                default:
                                    label = "请输入"
                                    break
                            }
                            config.column[i].form.rules[j].message = label + config.column[i].label
                        }
                        config.column[i].form.rules[j].trigger = ['blur', 'change']
                    }
                    formRules[config.column[i].prop] = config.column[i].form.rules
                }
                if (config.column[i].type === 'image' && config.column[i].url) {
                    tableForm[config.column[i].url] = null
                }
                if (config.column[i].baseKey) {
                    baseKeys.push(config.column[i].baseKey)
                }
                if (config.column[i].form.remoteMethodKey) {
                    config.column[i].form.remoteMethod = function () {
                        let param = {}
                        if (config.column[i].form.remoteMethodParams) {
                            config.column[i].form.remoteMethodParams.forEach(p => {
                                if (p.value) param[p.name] = p.value
                            })
                        }
                        proxy.callApi(config.column[i].form.remoteMethodKey, param).then(res => {
                            config.column[i].dicData = res[config.column[i].form.remoteMethodDataKey || 'data']
                        })
                    }
                }
            }
            if (config.column[i].search && config.column[i].search.show) {
                searchForm[config.column[i].search.prop || config.column[i].prop] = null
            } else if (config.column[i].defaultSearch) {
                searchForm[config.column[i].prop] = config.column[i].form.default || (config.column[i].form.multiple ? [] : null)
            }
            if (config.column[i].tableShow) {
                config.column[i].tableHeaderShow = true     // 参与列隐藏
            }
            if (config.column[i].formShow || config.column[i].tableShow || (config.column[i].search && config.column[i].search.show)) {
                if (config.column[i].dicKey && config.column[i].dicType === 'dicKey' && ['select', 'radio', 'checkbox'].includes(config.column[i].type)) {
                    dicKeys.push(config.column[i].dicKey)
                    config.column[i].dicLabel = "name"
                    config.column[i].dicId = "key"
                    tableForm[config.column[i].prop + '_pk'] = config.column[i].prop
                }
            }
        }
    }
    // 查询字典数据
    const getDictionaryChildList = function (keys) {
        proxy.$api.getChildDictionaryListByKeys({
            keys: keys
        }).then(res => {
            dictionaryData.value = res
            if (config.column && config.column.length) {
                for (let i = 0; i < config.column.length; i++) {
                    if (config.column[i].dicKey && config.column[i].dicType === 'dicKey') {
                        config.column[i].dicData = res[config.column[i].dicKey]
                        // if (Object.prototype.hasOwnProperty.call(config.column[i].form, "defaultIndex")) {
                        //     let defaultIndex = parseInt(config.column[i].form.defaultIndex)
                        //     if (!isNaN(defaultIndex)) {
                        //         tableForm[config.column[i].prop] = (config.column[i].dicData && config.column[i].dicData.length && config.column[i].dicData[defaultIndex]) ? config.column[i].dicData[defaultIndex][config.column[i].dicId] : null
                        //     }
                        // }
                    }
                }
            }
        })
    }
    if (dicKeys.length > 0) {
        getDictionaryChildList(dicKeys)
    }
    if (baseKeys.length > 0) {
        getDictionaryChildList(baseKeys)
    }

    const evalColumnMethods = function () {
        if (config.column && config.column.length) {
            for (let i = 0; i < config.column.length; i++) {
                if (config.column[i].form.remoteMethod && !config.column[i].form.remote) {
                    config.column[i].form.remoteMethod.call(proxy, config.column[i], tableForm, function (data) {
                        config.column[i].dicData = data
                    })
                }
            }
        }
    }

    /**
     * 组件切换事件
     * @param e
     * @param item
     * @param tableForm
     */
    const onChangeSelectEvent = function (val, item, form) {
        if (item.form.onChange) {
            item.form.onChange(val, item, form);
        }
    }

    /**
     * select 远程检索
     * @param searchKey
     * @param item
     */
    const onRemoteMethodEvent = function (searchKey, item) {
        if (item.form && item.form.remoteMethod) {
            item.form.remoteMethod(searchKey, tableForm, function (data) {
                item.dicData = data
            })
        }
    }

    return {formRules, tableForm, searchForm, dictionaryData, evalColumnMethods, onChangeSelectEvent, onRemoteMethodEvent}
}
export default tableStep
